package com.infore.siteManagement.dao;

import java.util.List;
import java.util.Map;

import com.infore.siteManagement.util.Page;

/**
 * 基础查询数据层接口
 * @author qiye
 * @date 2018年7月10日 下午6:48:13 
 */
public interface IEntityManagerDao {
	
	public <T> T insert(T t);
	
	/**
	 * 根据jpql和传入参数查询数据
	 * @author qiye
	 * @date 2018年7月30日 下午1:54:11 
	 * @param jpql
	 * @param objects
	 * @return
	 */
	public List<Object[]> findListByJPQL(String jpql, Object... objects );
	
	/**
	 * 根据jpql和传入参数查询数据
	 * @author qiye
	 * @date 2018年7月30日 下午1:54:38 
	 * @param jpql
	 * @param map
	 * @return
	 */
	public List<Object[]> findListByJPQL(String jpql, Map<String, Object> map );
	
	/**
	 * 根据jpql和传入类型查询该类型集合数据
	 * @author qiye
	 * @date 2018年7月10日 下午7:07:55 
	 * @param jpql
	 * @param clazz 返回结果实体类class
	 * @param objects 参数根据jpql中的位置对应
	 * @return
	 */
	public <T> List<T> findByJPQL(String jpql, Class<T> clazz, Object... objects );
	
	/**
	 * 根据jpql和传入类型查询该类型集合数据
	 * @author qiye
	 * @date 2018年7月11日 上午9:10:21 
	 * @param jpql 
	 * @param clazz 返回结果实体类class
	 * @param map 参数根据jpql中的占位符传入对应map参数
	 * @return
	 */
	public <T> List<T> findByJPQL(String jpql, Class<T> clazz, Map<String, Object> map);
	
	/**
	 * 根据jpql和传入类型分页查询该类型集合数据
	 * @author qiye
	 * @date 2018年7月10日 下午7:08:56 
	 * @param jpql
	 * @param pageNum 页码
	 * @param pageSize 分页大小
	 * @param clazz 返回结果实体类class
	 * @param objects 参数根据jpql中的位置对应
	 * @return
	 */
	public <T> List<T> findByJPQL(String jpql, int pageNum, int pageSize, Class<T> clazz, Object... objects );
	
	/**
	 * 根据jpql和传入类型分页查询该类型集合数据
	 * @author qiye
	 * @date 2018年7月11日 上午9:13:54 
	 * @param jpql
	 * @param pageNum 页码
	 * @param pageSize 分页大小
	 * @param clazz 返回结果实体类class
	 * @param map 参数根据jpql中的占位符传入对应map参数
	 * @return
	 */
	public <T> List<T> findByJPQL(String jpql, int pageNum, int pageSize, Class<T> clazz, Map<String, Object> map);
	
	/**
	 * 分页查询数据，返回封装Page
	 * @author qiye
	 * @date 2018年8月10日 下午6:50:17 
	 * @param jpql
	 * @param pageNum
	 * @param pageSize
	 * @param clazz
	 * @param objects
	 * @return
	 */
	public <T> Page<T> findPageByJPQL(String jpql, int pageNum, int pageSize, Class<T> clazz, Object... objects);
	
	/**
	 * 分页查询数据，返回封装Page
	 * @author qiye
	 * @date 2018年8月10日 下午6:36:41 
	 * @param jpql
	 * @param pageNum
	 * @param pageSize
	 * @param clazz
	 * @param map
	 * @return
	 */
	public <T> Page<T> findPageByJPQL(String jpql, int pageNum, int pageSize, Class<T> clazz, Map<String, Object> map);
	
	/**
	 * 查询数量
	 * @author qiye
	 * @date 2018年7月11日 上午9:50:23 
	 * @param jpql
	 * @param objects
	 * @return
	 */
	public Object findCount(String jpql, Object... objects);
	
	/**
	 * 查询数量
	 * @author qiye
	 * @date 2018年7月11日 上午9:50:38 
	 * @param jpql
	 * @param map
	 * @return
	 */
	public Object findCount(String jpql, Map<String, Object> map);
	
	public Object findCountBySql(String jpql, Map<String, Object> map);
	
	public Object findCountBySql(String jpql, Object... objects);
	
	/**
	 * 查询单个对象
	 * @author qiye
	 * @date 2018年7月12日 上午10:02:30 
	 * @param jpql
	 * @param clazz
	 * @param objects
	 * @return
	 */
	public <T> T findOneByJPQL(String jpql, Class<T> clazz, Object... objects);
	
	/**
	 * 查询单个对象
	 * @author qiye
	 * @date 2018年7月12日 上午10:02:54 
	 * @param jpql
	 * @param clazz
	 * @param map
	 * @return
	 */
	public <T> T findOneByJPQL(String jpql, Class<T> clazz, Map<String, Object> map);
	
	/**
	 * 根据sql查询数据
	 * @author qiye
	 * @date 2018年7月24日 下午5:57:22 
	 * @param sql
	 * @param clazz
	 * @param objects
	 * @return
	 */
	public <T> List<T> findBySQL(String sql, Class<T> clazz, Object... objects);
	
	/**
	 * 根据sql查询数据
	 * @author qiye
	 * @date 2018年7月24日 下午5:57:37 
	 * @param sql
	 * @param clazz
	 * @param map
	 * @return
	 */
	public <T> List<T> findBySQL(String sql, Class<T> clazz, Map<String, Object> map);
	
	/**
	 * 根据sql分页查询数据
	 * @author qiye
	 * @date 2018年7月25日 上午9:44:23 
	 * @param sql
	 * @param pageNum
	 * @param pageSize
	 * @param clazz
	 * @param objects
	 * @return
	 */
	public <T> Page<T> findPageBySQL(String sql, int pageNum, int pageSize, Class<T> clazz, Object... objects);
	
	/**
	 * 根据sql分页查询数据
	 * @author qiye
	 * @date 2018年7月25日 上午9:44:34 
	 * @param sql
	 * @param pageNum
	 * @param pageSize
	 * @param clazz
	 * @param map
	 * @return
	 */
	public <T> Page<T> findPageBySQL(String sql, int pageNum, int pageSize, Class<T> clazz, Map<String, Object> map);
	
	public List<Object[]> findPageBySQL(String sql, int pageNum, int pageSize, Map<String, Object> map);
	
	public List<Object[]> findPageBySQL(String sql, int pageNum, int pageSize, Object... objects);
	/**
	 * 根据sql查询数据，未自定义返回结果
	 * @author qiye
	 * @date 2018年7月27日 下午2:33:14 
	 * @param sql
	 * @param objects
	 * @return
	 */
	public List<Object[]> findBySQL(String sql, Object... objects);
	/**
	 * 根据sql查询数据，未自定义返回结果
	 * @author qiye
	 * @date 2018年7月27日 下午2:33:38 
	 * @param sql
	 * @param map
	 * @return
	 */
	public List<Object[]> findBySQL(String sql, Map<String, Object> map);

	public List<Map<String, Object>> getListMapBySQL(String sql);
	
	public Page<Map<String, Object>> findPageBySQL(String sql, int pageNum, int pageSize);
}
